#include <fstream>
#include <iomanip>
#include <sstream>
#include "Rala.h"
#include <iostream>

using namespace std;
int main(int argc, char* argv[]){

        int valDef = 0;
	int cantFilas = 3;  
	int cantCol = 5;

	Rala<int> ralaint1 = Rala<int>::Rala(cantFilas,cantCol, valDef);

// 	Se comprueba si todas las celdas en una matriz apenas creada tienen todos sus valores default
	bool todosDef = true;
	for (int f =0; f< cantFilas && todosDef; f++){
		for (int c = 0; c< cantCol && todosDef; c++){
			todosDef = (ralaint1.leer(f,c) == valDef);
		}
	}
	
	if (! todosDef){
		cout << "Error: alguna celda de una matriz nueva tiene un valor no default" << endl;
	}


// 	Se ejercita la asignación del primer valor no default de una fila vacia 
	ralaint1.asignar(1,2,30);

	if (ralaint1.leer(1,2) != 30)
		cout << "Error en asignacion del primer valor no nulo: el valor que contiene la celda es distinto del asignado" << endl;
	
//	Controlamos que la asignacion no modifica a las restantes celdas
  	bool noSideEf = true;
	for (int f =0; f< cantFilas && noSideEf; f++){
		for (int c = 0; c< cantCol && todosDef; c++){
			if (!(f== 1 && c== 2)) todosDef = (ralaint1.leer(f,c) == valDef);
		}
	}

	if (!noSideEf){
		cout << "Error en asignacion del primer valor no nulo: la asignacion cambia el valor de una celda distinta a la asignada" << endl;
	}

// 	Se ejercita la asignacion de un valor al inicio de una lista no vacia(considerando que la lista es ordenada)

	ralaint1.asignar(1,0,10);

	if (ralaint1.leer(1,0) != 10)
		cout << "Error en asignacion al principio de la lista: el valor que contiene la celda es distinto del asignado" << endl;

	if (ralaint1.leer(1,2) != 30)
		cout << "Error en asignacion al principio de la lista: Pierde el valor asignado a otra celda de la matriz" << endl;
	
//	Controlamos que la asignacion no modifica a las restantes celdas
  	noSideEf = true;
	for (int f =0; f< cantFilas && noSideEf; f++){
		for (int c = 0; c< cantCol && todosDef; c++){
			if (!(f== 1 && (c== 0||c== 2))) todosDef = (ralaint1.leer(f,c) == valDef);
		}
	}

	if (!noSideEf){
		cout << "Error en asignacion al principio de la lista: la asignacion cambia el valor de una celda distinta a la asignada" << endl;
	}

// 	Se  ejercita la asignacion de un valor en medio de una lista no vacia (considerando que la lista es ordenada)
	ralaint1.asignar(1,1,20);

	if (ralaint1.leer(1,0) != 10)
		cout << "Error en asignacion en medio de la lista: Pierde el valor asignado a una celda precedente" << endl;

	if (ralaint1.leer(1,1) != 20)
		cout << "Error en asignacion en medio de la lista: el valor que contiene la celda es distinto del asignado" << endl;

	if (ralaint1.leer(1,2) != 30)
		cout << "Error en asignacion en medio de la lista: Pierde el valor asignado a una celda posterior" << endl;

	
//	Controlamos que la asignacion no modifica a las restantes celdas
  	noSideEf = true;
	for (int f =0; f< cantFilas && noSideEf; f++){
		for (int c = 0; c< cantCol && todosDef; c++){
			if (!(f==1 && (c < 3)))  todosDef = (ralaint1.leer(f,c) == valDef);
		}
	}

	if (!noSideEf){
		cout << "Error en asignacion en  medio de la lista: la asignacion cambia el valor de una celda distinta a la asignada" << endl;
	}

// 	Se  ejercita la asignacion al final de una lista no vacia (considerando que la lista es ordenada)
	ralaint1.asignar(1,3,40);

	if (ralaint1.leer(1,0) != 10)
		cout << "Error en asignacion al final de la lista: Pierde el valor asignado a una celda precedente" << endl;

	if (ralaint1.leer(1,1) != 20)
		cout << "Error en asignacion al final de la lista: Pierde el valor asignado a una celda precedente" << endl;

	if (ralaint1.leer(1,2) != 30)
		cout << "Error en asignacion al final de la lista: Pierde el valor asignado a una celda precedente" << endl;

	if (ralaint1.leer(1,3) != 40)
		cout << "Error en asignacion al final de la lista: La celda contiene un valor distinto al asignado" << endl;
	

//	Controlamos que la asignacion no modifica a las restantes celdas
  	noSideEf = true;
	for (int f =0; f< cantFilas && noSideEf; f++){
		for (int c = 0; c< cantCol && todosDef; c++){
			if (!(f== 1 && c <  4)) todosDef = (ralaint1.leer(f,c) == valDef);
		}
	}

	if (!noSideEf){
		cout << "Error en asignacion al final la lista: la asignacion cambia el valor de una celda distinta a la asignada" << endl;
	}


// 	Se  ejercita la asignacion de un valor default eliminando un nodo en medio de la lista
	ralaint1.asignar(1,2,valDef);

	if (ralaint1.leer(1,0) != 10)
		cout << "Error en asignacion valor default eliminando un nodo en medio de la lista: Cambia el valor de una celda precedente" << endl;

	if (ralaint1.leer(1,1) != 20)
		cout << "Error en asignacion valor default eliminando un nodo en medio de la lista: Cambia el valor de una celda precedente" << endl;

	if (ralaint1.leer(1,2) != valDef)
		cout << "Error en asignacion valor default eliminando un nodo en medio de la lista: El valor default no es asignado correctamente" << endl;

	if (ralaint1.leer(1,3) != 40)
		cout << "Error en asignacion valor default eliminando un nodo en medio de la lista: Cambia el valor de una celda posterior" << endl;

//	Controlamos que la asignacion no modifica a las restantes celdas
  	noSideEf = true;
	for (int f =0; f< cantFilas && noSideEf; f++){
		for (int c = 0; c< cantCol && todosDef; c++){
			if (!(f== 1 && c <  4)) todosDef = (ralaint1.leer(f,c) == valDef);
		}
	}

	if (!noSideEf){
		cout << "Error en asignacion valor default eliminando un nodo en medio de la lista: la asignacion cambia el valor de una celda distinta a la asignada" << endl;
	}


// 	Se  ejercita la asignacion de un valor default en uNa posicion conteniendo un valor default -> No cambia la estructura
	ralaint1.asignar(1,2,valDef);

	if (ralaint1.leer(1,0) != 10)
		cout <<"Error en asignacion valor default eliminando un nodo en medio de la lista: Cambia el valor de una celda precedente" << endl;

	if (ralaint1.leer(1,1) != 20)
		cout << "Error en asignacion valor default eliminando un nodo en medio de la lista: Cambia el valor de una celda precedente" << endl;

	if (ralaint1.leer(1,2) != valDef)
		cout << "Error en asignacion valor default eliminando un nodo en medio de la lista: El valor default no es asignado correctamente" << endl;

	if (ralaint1.leer(1,3) != 40)
		cout << "Error en asignacion valor default eliminando un nodo en medio de la lista: Cambia el valor de una celda posterior"<< endl;

//	Controlamos que la asignacion no modifica a las restantes celdas
  	noSideEf = true;
	for (int f =0; f< cantFilas && noSideEf; f++){
		for (int c = 0; c< cantCol && todosDef; c++){
			if (!(f== 1 && (c == 0 || c== 1 || c== 3))) todosDef = (ralaint1.leer(f,c) == valDef);
		}
	}

	if (!noSideEf){
		cout << "Error en asignacionasignacion valor default eliminando un nodo en medio de la lista: la asignacion cambia el valor de una celda distinta a la asignada" << endl;
	}

// 	Se  ejercita la asignacion de un valor default eliminando el ultimo nodo de la lista
	ralaint1.asignar(1,3,valDef);

	if (ralaint1.leer(1,0) != 10)
		cout << "Error en asignacion valor default eliminando el ultimo nodo de la lista: Cambia el valor de una celda precedente" << endl;

	if (ralaint1.leer(1,1) != 20)
		cout << "Error en asignacion valor default eliminando el ultimo nodo de la lista: Cambia el valor de una celda precedente" << endl;

	if (ralaint1.leer(1,3) != valDef)
		cout << "Error en asignacion valor default eliminando el ultimo nodo  de la lista: El valor default no es asignado correctamente" << endl;

//	Controlamos que la asignacion no modifica a las restantes celdas
  	noSideEf = true;
	for (int f =0; f< cantFilas && noSideEf; f++){
		for (int c = 0; c< cantCol && todosDef; c++){
			if (!(f== 1 && c < 2)) todosDef = (ralaint1.leer(f,c) == valDef) ;
		}
	}

	if (!noSideEf){
		cout << "Error en asignacion valor default eliminando el ultimo nodo  de la lista: la asignacion cambia el valor de una celda distinta a la asignada" << endl;
	}

// 	Se  ejercita la asignacion de un valor default eliminando el primer nodo de la lista
	ralaint1.asignar(1,0,valDef);

	if (ralaint1.leer(1,0) != valDef)
		cout << "Error en asignacion valor default eliminando el primer nodo de la lista: El valor default no es asignado correctamente" << endl;

	if (ralaint1.leer(1,1) != 20)
		cout << "Error en asignacion valor default eliminando el ultimo nodo de la lista: Cambia el valor de una celda posterior" << endl;

//	Controlamos que la asignacion no modifica a las restantes celdas
  	noSideEf = true;
	for (int f =0; f< cantFilas && noSideEf; f++){
		for (int c = 0; c< cantCol && todosDef; c++){
			if (!(f== 1 && c == 1)) todosDef = (ralaint1.leer(f,c) == valDef);
		}
	}

	if (!noSideEf){
		cout << "Error en asignacion valor default eliminando el ultimo nodo de la lista: la asignacion cambia el valor de una celda distinta a la asignada" << endl;
	}

// 	Se  ejercita la asignacion de un valor default eliminando el unico nodo de la lista
	ralaint1.asignar(1,1,valDef);

	if (ralaint1.leer(1,1) != valDef)
		cout << "Error en asignacion valor default eliminando el unico nodo de la lista: El valor default no es asignado correctamente" << endl;

//	Controlamos que la asignacion no modifica a las restantes celdas
  	noSideEf = true;
	for (int f =0; f< cantFilas && noSideEf; f++){
		for (int c = 0; c< cantCol && todosDef; c++){
			todosDef = (ralaint1.leer(f,c) == valDef);
		}
	}

	if (!noSideEf){
		cout << "Error en asignacion  valor default eliminando el unico nodo de la lista: la asignacion cambia el valor de una celda distinta a la asignada" << endl;
	}



  return 0;
}

